package com.woniuxy.order.service;

import com.woniuxy.order.dto.OrderApplicationDto;
import com.woniuxy.order.dto.OrderApprovalDto;
import com.woniuxy.order.dto.OrderProcessDto;
import com.woniuxy.order.entity.OrderApplication;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * 订单服务接口
 */
public interface OrderService {
    
    /**
     * 创建订单申请
     */
    OrderApplication createOrderApplication(OrderApplicationDto orderApplicationDto, String currentUser);
    
    /**
     * 更新订单申请
     */
    OrderApplication updateOrderApplication(Long orderId, OrderApplicationDto orderApplicationDto, String currentUser);
    
    /**
     * 删除订单申请
     */
    void deleteOrderApplication(Long orderId, String currentUser);
    
    /**
     * 根据ID获取订单申请
     */
    OrderApplication getOrderApplicationById(Long orderId);
    
    /**
     * 根据订单编号获取订单申请
     */
    OrderApplication getOrderApplicationByOrderNo(String orderNo);
    
    /**
     * 分页查询订单申请
     */
    Page<OrderApplication> getOrderApplications(Pageable pageable, String customerName, String applicationStatus, String currentUser);
    
    /**
     * 获取用户的订单申请列表
     */
    List<OrderApplication> getUserOrderApplications(String currentUser);
    
    /**
     * 获取待审批订单列表
     */
    List<OrderApplication> getPendingOrderApplications(String currentUser);
    
    /**
     * 提交订单申请（启动工作流）
     */
    String submitOrderApplication(Long orderId, String currentUser);
    
    /**
     * 审批订单
     */
    void approveOrder(OrderApprovalDto approvalDto, String currentUser);
    
    /**
     * 获取订单流程信息
     */
    OrderProcessDto getOrderProcess(Long orderId);
    
    /**
     * 获取订单流程步骤
     */
    List<OrderProcessDto.ProcessStepDto> getOrderProcessSteps(String processInstanceId);
    
    /**
     * 获取订单统计信息
     */
    Map<String, Object> getOrderStatistics(String currentUser);
    
    /**
     * 取消订单申请
     */
    void cancelOrderApplication(Long orderId, String reason, String currentUser);
    
    /**
     * 更新订单状态（供flowable回调使用）
     */
    void updateOrderStatus(Long orderId, String status, String reason);
    
    /**
     * 更新订单状态（包含拒绝步骤信息）
     */
    void updateOrderStatusWithRejectStep(Long orderId, String status, String reason, String rejectStep);
    
    /**
     * 更新订单当前步骤（供flowable回调使用）
     */
    void updateOrderStep(Long orderId, String currentStep, String processInstanceId);
}

